package model

import (
	"time"
)

// Feed RSS订阅源模型
// 对应数据库表: feeds
type Feed struct {
	// ==================== 主键 ====================
	ID int64 `gorm:"primaryKey;autoIncrement" json:"id"`

	// ==================== 订阅源基本信息 ====================
	// URL RSS/Atom 源地址 (必填,唯一)
	URL string `gorm:"type:varchar(500);not null;uniqueIndex:uk_url" json:"url"`

	// Title 订阅源标题 (必填)
	Title string `gorm:"type:varchar(200);not null" json:"title"`

	// Description 订阅源描述 (可选)
	Description string `gorm:"type:text" json:"description"`

	// SiteURL 网站地址 (可选)
	SiteURL string `gorm:"type:varchar(500);column:site_url" json:"site_url"`

	// IconURL 图标地址 (可选)
	IconURL string `gorm:"type:varchar(500);column:icon_url" json:"icon_url"`

	// Category 分类 (默认: 未分类)
	Category string `gorm:"type:varchar(100);default:未分类;index:idx_category" json:"category"`

	// ==================== 抓取状态 ====================
	// LastFetchedAt 最后抓取时间 (可为 NULL)
	LastFetchedAt *time.Time `gorm:"column:last_fetched_at;index:idx_last_fetched" json:"last_fetched_at"`

	// FetchInterval 抓取间隔(秒) 默认: 3600 (1小时)
	FetchInterval int `gorm:"default:3600;column:fetch_interval" json:"fetch_interval"`

	// FetchError 最后一次抓取错误信息 (可为 NULL)
	FetchError string `gorm:"type:text;column:fetch_error" json:"fetch_error,omitempty"`

	// IsActive 是否启用 (默认: true)
	IsActive bool `gorm:"default:true;index:idx_is_active;column:is_active" json:"is_active"`

	// ==================== 统计信息 ====================
	// ArticleCount 文章总数 (冗余字段,提升性能)
	ArticleCount int `gorm:"default:0;column:article_count" json:"article_count"`

	// ==================== 时间戳 ====================
	// CreatedAt 创建时间 (GORM 自动管理)
	CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`

	// UpdatedAt 更新时间 (GORM 自动管理)
	UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`

	// ==================== 关联关系 ====================
	// Articles 该订阅源下的所有文章 (一对多)
	// gorm:"-" 表示不映射到数据库
	// 只在需要时通过 Repository 层加载
	Articles []Article `gorm:"foreignKey:FeedID;constraint:OnDelete:CASCADE" json:"articles,omitempty"`
}

// TableName 指定表名 (可选,GORM 默认会自动复数化)
// 不写这个方法,GORM 会自动将 Feed 映射到 feeds 表
func (Feed) TableName() string {
	return "feeds"
}

// ==================== 业务方法 ====================

// IsNeedFetch 判断是否需要抓取
// 规则: 距离上次抓取时间 >= FetchInterval
func (f *Feed) IsNeedFetch() bool {
	// 如果未启用,不需要抓取
	if !f.IsActive {
		return false
	}

	// 如果从未抓取过,需要抓取
	if f.LastFetchedAt == nil {
		return true
	}

	// 判断是否超过抓取间隔
	elapsed := time.Since(*f.LastFetchedAt)
	interval := time.Duration(f.FetchInterval) * time.Second
	return elapsed >= interval
}

// MarkFetched 标记为已抓取
func (f *Feed) MarkFetched() {
	now := time.Now()
	f.LastFetchedAt = &now
	f.FetchError = "" // 清空错误信息
}

// MarkFetchError 标记抓取失败
func (f *Feed) MarkFetchError(err error) {
	now := time.Now()
	f.LastFetchedAt = &now
	if err != nil {
		f.FetchError = err.Error()
	}
}

// IncrementArticleCount 增加文章计数
func (f *Feed) IncrementArticleCount(count int) {
	f.ArticleCount += count
}
